package com.macrohard.admin.exception;

// 返回Json（需搭配信息模板类 R）

import cn.dev33.satoken.exception.*;
import cn.dev33.satoken.stp.StpUtil;
import com.macrohard.admin.domain.AjaxJson;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Slf4j
//@RestControllerAdvice("xxx.RestController")
@RestControllerAdvice
public class GlobalExceptionHandlerForApi {

//    // 在当前类每个方法进入之前触发的操作
//    @ModelAttribute
//    public void get(HttpServletRequest request) throws IOException {
//
//    }

	// 全局异常拦截（拦截项目中的所有异常）
	@ExceptionHandler
	public AjaxJson handlerExceptions(Exception e, HttpServletRequest request, HttpServletResponse response) {

		log.info("全局异常(API)---------------");
		log.error(e.getMessage());

		String errPre = "Failure: ";

		// 不同异常返回不同状态码
		AjaxJson aj;
		if (e instanceof NotLoginException) {               // 如果是未登录异常
			NotLoginException ee = (NotLoginException) e;
			aj = AjaxJson.getNotLogin(errPre + "未登录：" + ee.getMessage());
		} else if (e instanceof NotRoleException) {         // 如果是角色异常
			NotRoleException ee = (NotRoleException) e;
			aj = AjaxJson.getNotJur(errPre + "无此角色：" + ee.getRole());
		} else if (e instanceof NotPermissionException) {   // 如果是权限异常
			NotPermissionException ee = (NotPermissionException) e;
			aj = AjaxJson.getNotJur(errPre + "无此权限：" + ee.getPermission());
		} else if (e instanceof DisableLoginException) {    // 如果是被封禁异常
			DisableLoginException ee = (DisableLoginException) e;
			aj = AjaxJson.getNotJur(errPre + "账号被封禁：" + ee.getDisableTime() + "秒后解封");
		} else if (e instanceof NotSafeException) {         // 如果是二级认证
			NotSafeException ee = (NotSafeException) e;
			log.info("二级认证异常：" + ee.getMessage());
			StpUtil.openSafe(120);
			aj = AjaxJson.getNotJur(errPre + "二级认证：请于120秒内进行二级认证后重新访问");
		}else {    // 普通异常, 输出：500 + 异常信息
			aj = AjaxJson.getError(errPre + e.getMessage());
		}

		// 返回给前端
		return aj;

		// 输出到客户端
//		response.setContentType("application/json; charset=utf-8"); // http说明，我要返回JSON对象
//		response.getWriter().print(new ObjectMapper().writeValueAsString(aj));
	}
}

